home *** CD-ROM | disk | FTP | other *** search
/ Zoom 2 / Zoom - Release 2 (1996)(Active Software)[!].iso / music / utilities / octamed4devkit / proplayer / proplayer.h < prev    next >
C/C++ Source or Header  |  1993-06-15  |  9KB  |  241 lines

  1. /* © Fully Copyrighted SEE ReadMe FILE
  2. /* C definitions for using the 'proplayer.a' and 'pro8player.a'
  3.    play-routines of OctaMED Pro V3 - V5. OctaMED Pro V5 -specific
  4.    features are marked as '(V5)'. */
  5.  
  6. /* $VER: proplayer_h 5.000 (30.05.1993) */
  7.  
  8. #ifndef EXEC_TYPES_H
  9. #include <exec/types.h>
  10. #endif
  11.  
  12. #ifdef LATTICE
  13. #ifndef OCTAPLR_LIB_PROTOS
  14. /* In 'proplayer.a' */
  15. LONG __asm InitPlayer(void);
  16. void __asm RemPlayer(void);
  17. void __asm PlayModule(register __a0 struct MMD0 *);
  18. void __asm ContModule(register __a0 struct MMD0 *);
  19. void __asm StopPlayer(void);
  20. void __asm SetTempo(register __d0 UWORD);
  21. /* In 'proloadmod.a' */
  22. struct MMD0 * __asm LoadModule(register __a0 char *);
  23. void __asm RelocModule(register __a0 struct MMD0 *);
  24. void __asm UnLoadModule(register __a0 struct MMD0 *);
  25. /* These are the definitions for the 8-channel OctaMED routines,
  26.    in 'pro8player.a' */
  27. LONG __asm InitPlayer8(void);
  28. void __asm RemPlayer8(void);
  29. void __asm PlayModule8(register __a0 struct MMD0 *);
  30. void __asm ContModule8(register __a0 struct MMD0 *);
  31. void __asm StopPlayer8(void);
  32. #endif
  33. #endif
  34.  
  35. /* If you're playing multi-modules, set the 'modnum' variable to the
  36.    number of the song you want to play before calling PlayModule(). */
  37.  
  38. #ifdef LATTICE_50
  39. extern UWORD far modnum;
  40.  
  41. /* 'modnum8' is the equivalent in 'mod8player' */
  42.  
  43. extern UWORD far modnum8;
  44. #else
  45. extern UWORD modnum,modnum8; /* for less intelligent compilers */
  46. #endif
  47.  
  48. /* This is the main module structure */
  49. struct MMD0 {   /* Also for MMD1 and MMD2 */
  50.     ULONG   id;         /* "MMD0", "MMD1" or "MMD2" */
  51.     ULONG   modlen;         /* module length (in bytes) */
  52.     struct  MMD0song *song;     /* pointer to MMD0song */
  53.     UWORD   psecnum;        /* (MMD2) - used by the player */
  54.     UWORD   pseq;           /* (MMD2) - used by the player */
  55.     struct  MMD0block **blockarr;   /* pointer to pointers of blocks */
  56.     ULONG   reserved1;
  57.     struct  Soitin **smplarr;   /* pointer to pointers of samples */
  58.     ULONG   reserved2;
  59.     struct  MMD0exp *expdata;   /* pointer to expansion data */
  60.     ULONG   reserved3;
  61. /* The following values are used by the play routine */
  62.     UWORD   pstate;         /* the state of the player */
  63.     UWORD   pblock;         /* current block */
  64.     UWORD   pline;          /* current line */
  65.     UWORD   pseqnum;        /* current # of playseqlist */
  66.     WORD    actplayline;        /* OBSOLETE!! SET TO 0xFFFF! */
  67.     UBYTE   counter;        /* delay between notes */
  68.     UBYTE   extra_songs;        /* number of additional songs, see
  69.                        expdata->nextmod */
  70. };
  71.  
  72. /* These are the structures for future expansions */
  73.  
  74. struct InstrExt {   /* This struct only for data required for playing */
  75. /* NOTE: THIS STRUCTURE MAY GROW IN THE FUTURE, TO GET THE CORRECT SIZE,
  76.    EXAMINE mmd0->expdata->s_ext_entrsz */
  77. /* ALSO NOTE: THIS STRUCTURE MAY BE SHORTER THAN DESCRIBED HERE,
  78.    EXAMINE mmd0->expdata->s_ext_entrsz */
  79.     UBYTE hold;
  80.     UBYTE decay;
  81.     UBYTE suppress_midi_off;    /* 1 = suppress, 0 = don't */
  82.     BYTE  finetune;
  83.     UBYTE default_pitch;    /* (V5) */
  84.     UBYTE instr_flags;  /* (V5) */
  85.     UWORD long_midi_preset; /* (V5), overrides the preset in the
  86.         song structure, if this exists, MMD0sample/midipreset
  87.         should not be used. */
  88. };
  89.  
  90. struct MMDInstrInfo {
  91.     UBYTE   name[40];
  92.     UBYTE   pad0;   /* two pads? */
  93.     UBYTE   pad1;
  94. };
  95.  
  96. struct MMD0exp {
  97.     struct MMD0 *nextmod;       /* for multi-modules */
  98.     struct InstrExt *exp_smp;   /* pointer to an array of InstrExts */
  99.     UWORD  s_ext_entries;       /* # of InstrExts in the array */
  100.     UWORD  s_ext_entrsz;        /* size of an InstrExt structure */
  101.     UBYTE  *annotxt;        /* 0-terminated message string */
  102.     ULONG  annolen;         /* length (including the 0-byte) */
  103. /* MED V3.20 data below... */
  104.     struct MMDInstrInfo *iinfo; /* "secondary" InstrExt for info
  105.                        that does not affect output */
  106.     UWORD  i_ext_entries;       /* # of MMDInstrInfos */
  107.     UWORD  i_ext_entrsz;        /* size of one */
  108.     ULONG  jumpmask;        /* OBSOLETE in current OctaMEDs */
  109.     UWORD  *rgbtable;       /* pointer to 8 UWORD values,
  110.                        ignored by OctaMED V5 and later */
  111.     UBYTE  channelsplit[4]; /* for OctaMED only (non-zero = NOT splitted) */
  112.     struct NotationInfo *n_info;    /* OctaMED notation editor info data */
  113.     UBYTE  *songname;   /* song name */
  114.     ULONG  songnamelen; /* length (including terminating zero) */
  115.     struct MMDDumpData *dumps; /* MIDI message dump data */
  116. /* These are still left, they must be 0 at the moment. */
  117.     ULONG  reserved2[7];
  118. };
  119.  
  120. /* Info for each instrument (mmd0->song.sample[xx]) */
  121.  
  122. struct MMD0sample {
  123.     UWORD rep,replen;   /* repeat/repeat length */
  124.     UBYTE midich;       /* midi channel for curr. instrument */
  125.     UBYTE midipreset;   /* midi preset (1 - 128), 0 = no preset */
  126.     UBYTE svol;     /* default volume */
  127.     BYTE strans;        /* sample transpose */
  128. };
  129.  
  130. /* The song structure (mmd0->song) */
  131.  
  132. struct MMD0song {
  133.     struct MMD0sample sample[63];   /* info for each instrument */
  134.     UWORD   numblocks;      /* number of blocks in this song */
  135.     UWORD   songlen;        /* number of playseq entries */
  136.     UBYTE   playseq[256];       /* the playseq list */
  137.     UWORD   deftempo;       /* default tempo */
  138.     BYTE    playtransp;     /* play transpose */
  139.     UBYTE   flags;          /* flags (see below) */
  140.     UBYTE   reserved;       /* for future expansion */
  141.     UBYTE   tempo2;         /* 2ndary tempo (delay betw. notes) */
  142.     UBYTE   trkvol[16];     /* track volume */
  143.     UBYTE   mastervol;      /* master volume */
  144.     UBYTE   numsamples;     /* number of instruments */
  145. }; /* length = 788 bytes */
  146.  
  147. /* The new PlaySeq structure of MMD2 */
  148.  
  149. struct PlaySeq {
  150.     char    name[32];   /* (0)  31 chars + \0 */
  151.     ULONG   reserved[2];    /* (32) for possible extensions */
  152.     UWORD   length;     /* (40) # of entries */
  153. /* Commented out, not all compilers may like it... */
  154. /*  UWORD   seq[0]; */  /* (42) block numbers.. */
  155. /* Note: seq[] values above 0x7FFF are reserved for future expansion! */
  156. };
  157.  
  158. /* This structure is used in MMD2s, instead of the above one.
  159.    (Be sure to cast the pointer.) */
  160.  
  161. struct MMD2song {
  162.     struct MMD0sample sample[63];
  163.     UWORD   numblocks;
  164.     UWORD   songlen;    /* NOTE: number of sections in MMD2 */
  165.     struct  PlaySeq **playseqtable;
  166.     UWORD   *sectiontable;  /* UWORD section numbers */
  167.     UBYTE   *trackvols; /* UBYTE track volumes */
  168.     UWORD   numtracks;  /* max. number of tracks in the song
  169.                    (also the number of entries in
  170.                     'trackvols' table) */
  171.     UWORD   numpseqs;   /* number of PlaySeqs in 'playseqtable' */
  172.     UBYTE   pad0[240];  /* reserved for future expansion */
  173. /* Below fields are MMD0/MMD1-compatible (except pad1[]) */
  174.     UWORD   deftempo;
  175.     BYTE    playtransp;
  176.     UBYTE   flags;
  177.     UBYTE   flags2;
  178.     UBYTE   tempo2;
  179.     UBYTE   pad1[16];   /* used to be trackvols, in MMD2 reserved */
  180.     UBYTE   mastervol;
  181.     UBYTE   numsamples;
  182. };
  183.  
  184.  /* FLAGS of the above structure */
  185. #define FLAG_FILTERON   0x1 /* hardware low-pass filter */
  186. #define FLAG_JUMPINGON  0x2 /* OBSOLETE now, but retained for compatibility */
  187. #define FLAG_JUMP8TH    0x4 /* also OBSOLETE */
  188. #define FLAG_INSTRSATT  0x8 /* instruments are attached (sng+samples)
  189.                    used only in saved (old) MED-songs */
  190. #define FLAG_VOLHEX 0x10    /* volumes are represented as hex */
  191. #define FLAG_STSLIDE    0x20    /* no effects on 1st timing pulse (STS) */
  192. #define FLAG_8CHANNEL   0x40    /* OctaMED 8 channel song, examine this bit
  193.                    to find out which routine to use */
  194. /* flags2 */
  195. #define FLAG2_BMASK 0x1F
  196. #define FLAG2_BPM   0x20
  197.  
  198. struct MMDDump {
  199.     ULONG   length;     /* dump data length */
  200.     UBYTE   *data;      /* data pointer */
  201.     UWORD   ext_len;    /* bytes remaining in this struct */
  202. /* ext_len >= 20: */
  203.     UBYTE   name[20];   /* message name (null-terminated) */
  204. };
  205.  
  206. struct MMDDumpData {
  207.     UWORD   numdumps;   /* number of message dumps */
  208.     UWORD   reserved[3];    /* not currently used */
  209. };  // Followed by <numdumps> pointers to struct MMDDump
  210.  
  211. /* flags in struct NotationInfo */
  212. #define NFLG_FLAT 1
  213. #define NFLG_3_4  2
  214.  
  215. struct NotationInfo {
  216.     UBYTE n_of_sharps;  /* number of #'s (or b's) */
  217.     UBYTE flags;        /* flags (see above) */
  218.     WORD  trksel[5];    /* selected track for each preset (-1 = none) */
  219.     UBYTE trkshow[16];  /* which tracks to show (bit 0 = for preset 0,
  220.                 bit 1 for preset 1 and so on..) */
  221.     UBYTE trkghost[16]; /* ghosted tracks (like trkshow[]) */
  222.     BYTE  notetr[63];       /* -24 - +24 (if bit #6 is negated, hidden) */
  223.     UBYTE pad;  /* perhaps info about future extensions */
  224. };
  225.  
  226. /* Below structs for MMD1 only! */
  227. struct BlockInfo {
  228.     ULONG   *hlmask;    /* highlight data */
  229.     UBYTE   *blockname; /* block name */
  230.     ULONG   blocknamelen;   /* length of block name (including term. 0) */
  231.     ULONG   reserved[6];    /* future expansion */
  232. };
  233.  
  234. struct MMD1Block {
  235.     UWORD numtracks;
  236.     UWORD lines;
  237.     struct BlockInfo *info;
  238. };
  239. #define MMD1BLKHDRSZ 8
  240.  
  241. /* Please refer to 'MMD.txt' for a complete description of MMD file format. */